package cn.iocoder.yudao.module.api.member.assets;

import cn.iocoder.yudao.module.api.member.assets.dto.MemberDigitalAssetsRespDTO;
import cn.iocoder.yudao.module.api.member.assets.enums.CryptocurrencyDeductionType;
import jakarta.annotation.Nonnull;

import java.util.Map;
import java.util.Set;

/**
 * <pre>
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 *  这里是文件说明
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 * </pre>
 *
 * @author 山野羡民（1032694760@qq.com）
 * @since 2025/02/07
 */
public interface MemberDigitalAssetsApi {

    /**
     * 获取用户数字资产信息
     *
     * @param userId 用户编号
     * @return 详细信息
     */
    @Nonnull
    MemberDigitalAssetsRespDTO getDetail(Long userId);

    /**
     * 获得用户数字资产信息
     *
     * @param userIds 用户编号集合
     * @return 数字资产信息
     */
    Map<Long, MemberDigitalAssetsRespDTO> getMapByUserIds(Set<Long> userIds);

    /**
     * 释放商家原始的联盟豆，即：减少冻结中的联盟豆并增加原始的联盟豆
     *
     * @param userId 用户编号
     * @param number 数量，只能是正数
     */
    void unfreezeCryptocurrencyOrigin(Long userId, Double number);

    /**
     * 收益豆抵扣
     *
     * @param userId 用户编号
     * @param number 正数
     */
    CryptocurrencyDeductionType payCryptocurrencyIncrement(Long userId, Double number);

    /**
     * 收益豆退还
     *
     * @param userId 用户编号
     * @param number 正数
     */
    void refundCryptocurrencyIncrement(Long userId, Double number);

    /**
     * 增加或减少用户原始的联盟豆
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changeCryptocurrencyOrigin(Long userId, Double number);

    /**
     * 联盟豆转为收益豆
     *
     * @param userId 用户编号
     * @param number 数量，正数
     */
    void exchangeCryptocurrencyOriginToIncrement(Long userId, Double number);

    /**
     * 增加或减少用户的冻结中的联盟豆
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changeCryptocurrencyFreezing(Long userId, Double number);

    /**
     * 联盟豆兑换投入收益池
     *
     * @param userId 用户编号
     * @param number 数量，正数
     */
    void exchangeCryptocurrencyOriginToIncreasing(Long userId, Double number);

    /**
     * 联盟豆增值
     *
     * @param userId 用户编号
     * @param number 数量，正数
     */
    void increaseCryptocurrencyIncrement(Long userId, Double number);

    /**
     * 返回联盟豆本金
     *
     * @param userId 用户编号
     * @param number 数量，正数
     */
    void returnCryptocurrencyIncreasing(Long userId, Double number);

    /**
     * 增加或减少用户的分红
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changeBonus(Long userId, Double number);

}
